import useSettingsStore from '@/store/modules/settings'
import useUserStore from '@/store/modules/user'
import axios from 'axios'
// import qs from 'qs'
import { toast } from 'vue-sonner'

const api = axios.create({
  baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY) || (import.meta.env.PROD) ? '/api/' : import.meta.env.VITE_APP_API_BASEURL,
  timeout: 1000 * 60,
  responseType: 'json',
})

api.interceptors.request.use(
  (request) => {
    const settingsStore = useSettingsStore()
    const userStore = useUserStore()
    // 全局拦截请求发送前提交的参数
    // 设置请求头
    if (request.headers) {
      request.headers['Accept-Language'] = settingsStore.lang
      if (userStore.isLogin) {
        request.headers.Authorization = `Bearer ${userStore.token}`
      }
    }
    // 是否将 POST 请求参数进行字符串化处理
    if (request.method === 'post') {
      // request.data = qs.stringify(request.data, {
      //   arrayFormat: 'brackets',
      // })
    }
    return request
  },
)

api.interceptors.response.use(

  (response: any) => {
    /**
     * 全局拦截请求发送后返回的数据，如果数据有报错则在这做全局的错误提示
     * 假设返回数据格式为：{ status: 1, error: '', data: {} }
     * 规则是当 status 为 1 时表示请求成功，为 0 时表示接口需要登录或者登录状态失效，需要重新登录
     * 请求出错时 error 会返回错误信息
     */
    const data = response.data
    const code = data.code
    if (code === 200) {
      return response.data
    }
    else {
      // 错误code码需停止进一步请求处理，进行界面提示
      switch (code) {
        case 401:
          toast.error('登录状态已过期，请重新登录')
          // 登录过期需要登出重新登录
          useUserStore().requestLogout()
          return Promise.reject(new Error('无效的会话，或者会话已过期，请重新登录。'))
        case 601:
          // 提示警告类信息
          toast.warning(data.msg)
          return Promise.reject(new Error(data.msg))
        default:
          // 未特殊捕获的错误码都进行错误提示
          toast.error(data.msg)
          return Promise.reject(new Error(data.msg))
      }
    }
  },
  (error) => {
    // HTTP 请求错误处理
    let message = error.message
    if (message === 'Network Error') {
      message = '网络故障,请稍后重试'
    }
    else if (message.includes('timeout')) {
      message = '请求超时,请稍后重试'
    }
    else if (message.includes('Request failed with status code')) {
      message = `服务器异常,请稍后重试`
    }
    toast.error('Error', {
      description: message,
    })
    return Promise.reject(error)
  },
)
export default api
